# Regression test for #56222: 'go get -t' and 'go mod tidy'
# should save enough checksums to run 'go test' on the named
# packages or any package in "all" respectively.

# 'go mod tidy' in a module at go 1.21 or higher should preserve
# checksums needed to run 'go test all'.
cd m1
go mod tidy

go list -f '{{if eq .ImportPath "example.com/generics"}}{{.Module.GoVersion}}{{end}}' -deps -test example.com/m2/q
stdout 1.18
[!short] go test -o $devnull -c all

cat go.sum
replace 'example.com/generics v1.0.0/go.mod' 'example.com/notgenerics v1.0.0/go.mod' go.sum

! go list -f '{{if eq .ImportPath "example.com/generics"}}{{.Module.GoVersion}}{{end}}' -deps -test example.com/m2/q
stderr '^go: can''t load test package: \.\.'${/}m2${/}q${/}'q_test.go:3:8: example\.com/generics@v1\.0\.0: missing go.sum entry for go.mod file; to add it:\n\tgo mod download example\.com/generics$'

go mod download -json example.com/generics
stdout '"GoModSum":'
go list -f '{{if eq .ImportPath "example.com/generics"}}{{.Module.GoVersion}}{{end}}' -deps -test example.com/m2/q
stdout 1.18


# At go 1.20 or earlier, 'go mod tidy' should preserve the historical go.sum
# contents, but 'go test' should flag the missing checksums (instead of trying
# to build the test dependency with the wrong language version).

go mod tidy -go=1.20
! go test -o $devnull -c all
stderr '^# example.com/m2/q\n'..${/}m2${/}q${/}'q_test.go:3:8: example.com/generics@v1.0.0: missing go.sum entry for go.mod file; to add it:\n\tgo mod download example.com/generics$'

go mod download -json example.com/generics
go list -f '{{if eq .ImportPath "example.com/generics"}}{{.Module.GoVersion}}{{end}}' -deps -test example.com/m2/q
stdout 1.18


# Even at go 1.20 or earlier, 'go mod tidy' shouldn't need go.mod files or
# checksums that it won't record.

go mod tidy -go=1.20
go clean -modcache  # Remove checksums from the module cache, so that only go.sum is used.

env OLDSUMDB=$GOSUMDB
env GOSUMDB=bad
go mod tidy

env GOSUMDB=$OLDSUMDB


# Regardless of the go version in go.mod, 'go get -t' should fetch
# enough checksums to run 'go test' on the named package.

rm p
go mod tidy -go=1.20
go list -m all
! stdout example.com/generics
go get -t example.com/m2/q@v1.0.0
go list -f '{{if eq .ImportPath "example.com/generics"}}{{.Module.GoVersion}}{{end}}' -deps -test example.com/m2/q
stdout 1.18
[!short] go test -o $devnull -c example.com/m2/q


-- m1/go.mod --
module example.com/m1

go 1.21

require example.com/m2 v1.0.0
replace example.com/m2 => ../m2
-- m1/p/p.go --
package p

import _ "example.com/m2/q"
-- m2/go.mod --
module example.com/m2

go 1.19

require example.com/generics v1.0.0
-- m2/q/q.go --
package q
-- m2/q/q_test.go --
package q

import _ "example.com/generics"
